/*
 * Thread.h
 *
 *  PEREIRA, FERNANDO ROQUE
 *  91610
 *
 *  Encapsulacion de funcionalidad de libreria pthread (POSIX thread). Toda vez
 *  que se quiera crear un hilo para determinada tarea, la clase en cuestion
 *  debera heredar de esta misma, para obtener las funcionalidades que provee
 *  la libreria mencionada
 */

#include <pthread.h>
#include <signal.h>
#include <iostream>
#include <cstring>

#ifndef THREAD_H_
#define THREAD_H_

class Thread {
	protected:
		bool running;	// Estado del hilo (corriendo o no)
		pthread_t id;	// Id que identifica a cada hilo correspondiente

		static void* tarea (void* arg)
		{
			((Thread*)arg)->run();
			return arg;
		}

	public:
		Thread(){running = true;};
		//Thread(const Thread& th);
		virtual ~Thread(){};

		// Funcionalidades de un hilo
		virtual void start() {
			pthread_create(&id, 0, tarea, (void*)this);
		}

		virtual void stop() {running = false;};
		virtual void exit() {pthread_exit(NULL);};
		virtual void kill() {pthread_kill(id, 0);};
		virtual void cancel() {pthread_cancel(id);};
		virtual void join()
		{
			void* arg;
			pthread_join(this->id, &arg);
		};

		virtual void run() = 0;
};

#endif
